package designModal;

/**
 * 单例模式
 * 1. 懒加载
 * 2. 饿汗式加载
 * 3. 双重校验锁
 *
 * Author: shen qi han
 * Date: 2022/4/8 下午9:20
 */
public class SingletonMain {


    class LazySingleton{
        private LazySingleton instance;
        public synchronized LazySingleton getInstance(){
            if(instance == null){
                instance = new LazySingleton();
            }
            return instance;
        }
    }

    /**
     * 这里说说明下，因为是内部类，所以class前面需要加上 static
     */
    static class StarveSingleton{
        private static StarveSingleton instance =  new StarveSingleton();
        private StarveSingleton(){}
        private static StarveSingleton getInstance(){
            return instance;
        }
    }

    /**
     * double check lock
     */
    class DclSingleton{
        private volatile DclSingleton instance;
        public DclSingleton getInstance(){
            if(instance == null){
                synchronized(DclSingleton.class){
                    // 为什么要再判断一次，以及 volatile关键字的使用
                    // 当第n个线程，实例化之后，第n-1个线程拿到锁进到此代码块，此时若不判断的话
                    // 就会导致再次实例一个instance，无法达到单例的目的
                    if(instance == null){
                        instance = new DclSingleton();
                    }
                }
            }
            return instance;
        }
    }

}
